package com.xxjh.brs.ftp.service.impl;

import com.xxjh.brs.ftp.common.predicate.FtpPredicate;
import com.xxjh.brs.ftp.service.AbstractFtpService;
import com.xxjh.brs.ftp.vo.FileVo;
import com.xxjh.brs.ftp.vo.FloderVo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.pool2.ObjectPool;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * @author CHENCHEN
 * @title 被推送方服务器FTP提供方法
 * @company 新兴际华科技（天津）有限公司
 * @create 2024-07-03 19:21
 */
@Slf4j
@Component
@Scope("prototype")
public class FtpPushService extends AbstractFtpService {

    @Autowired
    @Qualifier("ftpClientPoolPush")
    private ObjectPool<FTPClient> ftpClientPoolPush;

    @Value("${spring.ftp.pushServer.pusherDir}")
    protected String pusherDir;

    @Override
    protected ObjectPool<FTPClient> getFtpClientPool() {
        return ftpClientPoolPush;
    }

    /**
     * 本地文件上传到FTP服务器。
     * 支持多级目录文件
     *
     * @param drictoryPath FTP目标服务器根路径下具体某文件夹路径。
     * @param specifiedLayer 代表指定目录。
     *
     */
    public void localDirectoryUploadToFtp(String drictoryPath, String specifiedLayer){
        getFTPClient();
        uploadLocalFtp(pusherDir, drictoryPath + specifiedLayer);
    }

    /**
     * 查找FTP服务器指定文件夹下是否存在指定文件并返回路径。
     *
     * @param drictoryPath FTP目标服务器根路径下具体某文件夹路径。
     * @param specifiedLayer 有值代表指定目录，无值检索全部。
     * @param ftpPredicate    断言，匹配满足需求的文件及目录。
     * @return FTP服务器现所有指定规则文件存放路径。
     */
    public List<FileVo> findFtpCustomizedDirectory(String drictoryPath, String specifiedLayer, FtpPredicate ftpPredicate){
        getFTPClient();
        return searcherFtpCustomizedDirectory(pusherDir + drictoryPath, specifiedLayer, ftpPredicate);
    }

    /**
     * FTP获取资源服务器指定文件夹最后更新时间
     *
     * @param drictoryPath 指定路径。
     * @param specifiedLayer 文件夹名称。
     * @return 当前文件夹属性类。
     */
    public FloderVo findLastUpdateFloder(String drictoryPath, String specifiedLayer){
        getFTPClient();
        return lastUpdateFloderProperties(pusherDir + drictoryPath, specifiedLayer);
    }

    /**
     * 删除FTP服务器指定目录及其所有内容（包括子目录和文件）。
     *
     * @param rootPath 根目录后的指定目录。
     * @param directoryPath 目录下要删除的目录。
     * @return 如果目录及其内容成功删除则返回true，否则返回false。
     */
    public boolean deleteFtpDirectory(String rootPath, String directoryPath){
        getFTPClient();
        return deleteDirectoryRecursively(ftpParentPath + pusherDir + rootPath + directoryPath);
    }

}
